package com.luoshizhen.lease.web.app.custom.config;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class Knife4jConfiguration {

    /**
     * 配置自定义的OpenAPI信息
     *
     * 此方法用于设置OpenAPI的全局信息，包括API的标题、版本、描述、服务条款和许可证信息
     * 通过注解@Bean，该方法确保了在Spring容器中会创建并初始化一个OpenAPI实例
     *
     * @return OpenAPI 实例，包含了API的全局信息
     */
    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("APP接口")
                        .version("1.0")
                        .description("用户端APP接口")
                        .termsOfService("http://doc.xiaominfo.com")
                        .license(new License().name("Apache 2.0")
                                .url("http://doc.xiaominfo.com")));
    }


    /**
     * 配置登录信息相关的OpenApi
     *
     * 该方法定义了应用程序中与登录信息相关的API分组通过指定路径，
     * 确保与登录和应用信息获取相关的端点被组织到同一个分组中
     *
     * @return GroupedOpenApi 返回配置好的登录信息OpenApi分组
     */
    @Bean
    public GroupedOpenApi loginAPI() {
        // 创建并配置一个GroupedOpenApi实例，指定分组名为"登录信息"
        // 并定义匹配的路径，以便将相关API组织到此分组下
        return GroupedOpenApi.builder().group("登录信息").
                pathsToMatch("/app/login/**", "/app/info").
                build();
    }

    /**
     * 配置并创建个人信息相关的OpenApi组
     * 该方法主要用于定义哪些API路径应被分组到个人信息类别中，以便在OpenApi文档中进行更好的组织和展示
     *
     * @return GroupedOpenApi 实例，配置了个人信息相关的API路径
     */
    @Bean
    public GroupedOpenApi personAPI() {
        // 创建GroupedOpenApi实例，指定分组名称为"个人信息"
        // 并定义该分组包含的API路径，使用pathsToMatch方法
        // 这里包括了应用历史、预约和协议相关的API路径
        return GroupedOpenApi.builder().group("个人信息").
                pathsToMatch(
                        "/app/history/**",
                        "/app/appointment/**",
                        "/app/agreement/**"
                ).
                build();
    }

    /**
     * 配置并创建找房信息相关的OpenAPI分组
     *
     * 该方法通过Spring的@Bean注解定义了一个Bean对象，类型为GroupedOpenApi
     * 主要目的是对API进行分组，以便在大型项目中更好地管理和组织API文档
     *
     * @return GroupedOpenApi 实例，配置了找房信息相关的API路径
     */
    @Bean
    public GroupedOpenApi lookForRoomAPI() {
        // 创建并配置GroupedOpenApi实例，指定分组名为"找房信息"
        // 同时定义了该分组包含的API路径，涉及公寓、房间、支付、区域和期限等相关接口
        return GroupedOpenApi.builder().group("找房信息").
                pathsToMatch(
                        "/app/apartment/**",
                        "/app/room/**",
                        "/app/payment/**",
                        "/app/region/**",
                        "/app/term/**"
                ).
                build();
    }
}